/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.tomasio.projects.welcome;

import com.tomasio.projects.welcome.dao.AutorizacaoDeAcessoDAO;
import com.tomasio.projects.welcome.dao.CartaoDAO;
import com.tomasio.projects.welcome.dao.DAOFactory;
import com.tomasio.projects.welcome.dao.GrupoAutorizacaoDeAcessoDAO;
import com.tomasio.projects.welcome.dao.PessoaDAO;
import com.tomasio.projects.welcome.dao.ProibicaoDeAcessoDAO;
import com.tomasio.projects.welcome.dao.VeiculoDAO;
import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoColetivaDTO;
import com.tomasio.projects.welcome.dto.AutorizacaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.CartaoDTO;
import com.tomasio.projects.welcome.dto.GrupoAutorizacaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.PessoaDTO;
import com.tomasio.projects.welcome.dto.ProibicaoDeAcessoDTO;
import com.tomasio.projects.welcome.dto.TranseunteDTO;
import com.tomasio.projects.welcome.dto.VeiculoDTO;
import com.tomasio.projects.welcome.interfaces.AutorizacaoService;
import com.tomasio.projects.welcome.util.DAOUtil;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 *
 * @author administrador
 */
public class SimpleAutorizacaoService implements AutorizacaoService {

    private static Long ID_GAP = 50000L;
    private DAOFactory factory = DAOUtil.getDAOFactory();

    @Override
    public void createAutorizacaoDeAcesso(AutorizacaoDeAcessoDTO autorizacao) {
        AutorizacaoDeAcessoDAO autorizacaoDAO = factory.getAutorizacaoDeAcessoDAO();

        try {

            if ((autorizacao.getTranseunte() instanceof PessoaDTO)
                    && autorizacao.getTranseunte().getId() == null) {
                PessoaDTO pessoa = (PessoaDTO) autorizacao.getTranseunte();
                Long pessoaId = createPessoa(pessoa);
                pessoa = findPessoa(pessoaId);
                autorizacao.setTranseunte(pessoa);
                autorizacaoDAO.create(autorizacao);


            } else {
                PessoaDTO pessoa = (PessoaDTO) autorizacao.getTranseunte();
                updatePessoa(pessoa);
                autorizacaoDAO.create(autorizacao);
            }
        } catch (Exception e) {
            //System.out.println("Erro na criação de autorização de acesso individual");
            e.printStackTrace();
        }



    }

    @Override
    public void updateAutorizacaoDeAcesso(AutorizacaoDeAcessoDTO autorizacao) {
        AutorizacaoDeAcessoDAO dao = factory.getAutorizacaoDeAcessoDAO();
        dao.update(autorizacao);
    }

    @Override
    public void createGrupoAutorizacaoDeAcesso(GrupoAutorizacaoDeAcessoDTO grupo) {
        GrupoAutorizacaoDeAcessoDAO dao = factory.getGrupoAutorizacaoDeAcessoDAO();
        // System.out.println("Grupo: " + grupo.getDescricao());
        // System.out.println("Id: " + grupo.getId());
        // System.out.println("Numero de Autorizacoes: " + grupo.getAutorizacoesDeAcesso().size());
        for (AutorizacaoDeAcessoDTO autorizacao : grupo.getAutorizacoesDeAcesso()) {
            //    System.out.println("------" + autorizacao.getTranseunte().getId());
//            System.out.println(((AutorizacaoDeAcessoColetivaDTO) autorizacao).getGrupo().toString());
        }
        dao.create(grupo);
    }

    @Override
    public void updateGrupoAutorizacaoDeAcesso(GrupoAutorizacaoDeAcessoDTO grupo) {
        GrupoAutorizacaoDeAcessoDAO dao = factory.getGrupoAutorizacaoDeAcessoDAO();
        dao.update(grupo);
    }

    @Override
    public void removeGrupoAutorizacaoDeAcesso(Long grupoAutorizacaoId) {
        GrupoAutorizacaoDeAcessoDAO dao = factory.getGrupoAutorizacaoDeAcessoDAO();
        dao.remove(grupoAutorizacaoId);
    }

    @Override
    public GrupoAutorizacaoDeAcessoDTO findGrupoAutorizacaoDeAcesso(Long grupoAutorizacaoId) {
        GrupoAutorizacaoDeAcessoDAO dao = factory.getGrupoAutorizacaoDeAcessoDAO();

        GrupoAutorizacaoDeAcessoDTO grupo = dao.find(grupoAutorizacaoId);
        for (AutorizacaoDeAcessoColetivaDTO autorizacao : grupo.getAutorizacoesDeAcesso()) {
            autorizacao.setTranseunte(findPessoa(autorizacao.getTranseunteId()));
        }
        return grupo;
    }

    @Override
    public List<GrupoAutorizacaoDeAcessoDTO> findAllGruposAutorizacaoDeAcesso() {
        GrupoAutorizacaoDeAcessoDAO dao = factory.getGrupoAutorizacaoDeAcessoDAO();
        return dao.findAll();
    }

    @Override
    public List<AutorizacaoDeAcessoDTO> findAutorizacoesDeAcesso(Long transeunteId) {
        TranseunteDTO transeunte;
        if (transeunteId > ID_GAP) {
            PessoaDAO dao = factory.getPessoaDAO();
            transeunte = dao.find(transeunteId);
        } else {
            VeiculoDAO dao = factory.getVeiculoDAO();
            transeunte = dao.find(transeunteId);
        }
        Set<AutorizacaoDeAcessoDTO> autorizacoesSet =
                transeunte.getAutorizacoesDeAcesso();
        ArrayList<AutorizacaoDeAcessoDTO> autorizacoesList =
                new ArrayList<AutorizacaoDeAcessoDTO>();
        for (AutorizacaoDeAcessoDTO autorizacao : autorizacoesSet) {
            autorizacoesList.add(autorizacao);
        }
        return autorizacoesList;
    }

    @Override
    public List<ProibicaoDeAcessoDTO> findProibicoesDeAcesso(Long transeunteId) {
        TranseunteDTO transeunte = findTranseunte(transeunteId);
        
        Set<ProibicaoDeAcessoDTO> proibicoesSet = transeunte.getProibicoesDeAcesso();
        ArrayList<ProibicaoDeAcessoDTO> proibicoesList =
                new ArrayList<ProibicaoDeAcessoDTO>();
        for (ProibicaoDeAcessoDTO proibicao : proibicoesSet) {
            proibicoesList.add(proibicao);
        }
        return proibicoesList;
    }

    @Override
    public CartaoDTO findCartaoByNumero(String numero) {
        CartaoDAO dao = factory.getCartaoDAO();
        return dao.findByNumero(numero);
    }

    @Override
    public List<PessoaDTO> searchPessoasByIdentidade(String searchTerm) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.searchByIdentidade(searchTerm);
    }

    @Override
    public List<PessoaDTO> searchPessoasByName(String searchTerm) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.searchByName(searchTerm);
    }

    @Override
    public List<VeiculoDTO> searchVeiculosByPlaca(String searchTerm) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        return dao.searchByPlaca(searchTerm);
    }

    @Override
    public PessoaDTO findPessoa(Long pessoaId) {
        PessoaDAO dao = factory.getPessoaDAO();
        PessoaDTO pessoa = dao.find(pessoaId);
        
        return pessoa;
    }

    @Override
    public VeiculoDTO findVeiculo(Long veiculoId) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        return dao.find(veiculoId);
    }

    @Override
    public TranseunteDTO findTranseunte(Long transeunteId) {

        if (transeunteId > ID_GAP) {
            return findPessoa(transeunteId);
        } else {
            return findVeiculo(transeunteId);
        }

    }

    @Override
    public PessoaDTO findPessoaByCPF(String cpf) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.findByCPF(cpf);
    }

    @Override
    public VeiculoDTO findVeiculoByPlaca(String placa) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        return dao.findByPlaca(placa);
    }

    @Override
    public PessoaDTO findPessoaByIdentidade(String numero, String orgaoExp) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.findByIdentidade(numero, orgaoExp);
    }

    @Override
    public List<PessoaDTO> searchPessoasByNameWithFotos(String searchTerm) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.searchByNameWithFotos(searchTerm);
    }

    @Override
    public long createPessoa(PessoaDTO pessoa) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.create(pessoa);
    }

    @Override
    public long updatePessoa(PessoaDTO pessoa) {
        PessoaDAO dao = factory.getPessoaDAO();
        return dao.update(pessoa);
    }

    @Override
    public List<ProibicaoDeAcessoDTO> findAllProibicoesDeAcesso() {
        ProibicaoDeAcessoDAO dao = factory.getProibicaoDeAcessoDAO();
        List<ProibicaoDeAcessoDTO> proibicoes = dao.findAll();
        for (ProibicaoDeAcessoDTO proibicaoDeAcessoDTO : proibicoes) {
            proibicaoDeAcessoDTO.setTranseunte(findTranseunte(proibicaoDeAcessoDTO.getTranseunteId()));
        }
        return proibicoes;
    }

    @Override
    public void createProibicaoDeAcesso(ProibicaoDeAcessoDTO proibicao) {
        ProibicaoDeAcessoDAO dao = factory.getProibicaoDeAcessoDAO();
        dao.create(proibicao);
    }

    @Override
    public void removeProibicaoDeAcesso(Long id) {
        ProibicaoDeAcessoDAO dao = factory.getProibicaoDeAcessoDAO();
        dao.remove(id);
    }

    @Override
    public void updateProibicaoDeAcesso(ProibicaoDeAcessoDTO proibicao) {
        ProibicaoDeAcessoDAO dao = factory.getProibicaoDeAcessoDAO();
        dao.update(proibicao);
    }

    @Override
    public ProibicaoDeAcessoDTO findProibicaoDeAcesso(Long proibicaoId) {
        ProibicaoDeAcessoDAO dao = factory.getProibicaoDeAcessoDAO();
        ProibicaoDeAcessoDTO proibicao = dao.find(proibicaoId);
        proibicao.setTranseunte(findTranseunte(proibicao.getTranseunteId()));
        return proibicao;
    }

    @Override
    public void createVeiculo(VeiculoDTO veiculo) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        dao.create(veiculo);
    }

    @Override
    public void updateVeiculo(VeiculoDTO veiculo) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        dao.update(veiculo);
    }

    @Override
    public void removeVeiculo(Long id) {
        VeiculoDAO dao = factory.getVeiculoDAO();
        dao.remove(id);
    }

    @Override
    public List<VeiculoDTO> findAllVeiculos() {
        VeiculoDAO dao = factory.getVeiculoDAO();
        return dao.findAll();
    }

   


}
